package com.ai.bitcoin.jpa.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.math.BigDecimal;
import java.math.RoundingMode;

@EqualsAndHashCode(callSuper = true)
@Entity
@Data
@Table(name = "bcc_user_bonus_config")
@DynamicInsert
@DynamicUpdate
//@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class BccUserBonusConfig extends Identity {
    //随机字符分隔符
    public static final String RANDOM_BONUS_SEPARATOR = "-";

    private static final long serialVersionUID = 8840099353356208478L;

    //公共号来源
    public static final String EVENT_SOURCE_MP = "01";
    //群组来源
    public static final String EVENT_SOURCE_GROUP = "02";
    //价值内容
    public static final String EVENT_SOURCE_SHARE = "03";
    //固定奖励
    public static final String BONUS_TYPE_FIXED = "01";
    //随机奖励
    public static final String BONUS_TYPE_RANDOM = "02";
    //百分比下级收益
    public static final String BONUS_TYPE_PERCENT = "03";
    //增加奖励次数
    public static final String BONUS_TYPE_ADD_TIMES = "04";
    //无奖励
    public static final String BONUS_TYPE_NONE = "99";
    //奖励单位
    //01 次/人 02 次/人*天 03 次/人*群 04 次/人*天按文章 05 次/人*天 按文章与阅读
    public static final String UNIT_TYPE_TIME_USER = "01";
    public static final String UNIT_TYPE_TIME_USER_DAY = "02";
    public static final String UNIT_TYPE_TIME_USER_GROUP = "03";
    public static final String UNIT_TYPE_TIME_USER_ARTICLE = "04";
    public static final String UNIT_TYPE_TIME_USER_ARTICLE_CLICK = "05";

    // 触发方式
    // 01 公众号 02 微信群 03 价值内容
    private String eventSourceCd;

    //触发类型
    // 0101 关注奖励 0102 签到奖励 0103 邀请关注 0104 公众号关键字命中
    // 0201 群签到 0202 群关键字命中 0203 拉新人入群 0204 创建新群
    // 0301 阅读价值文章 0302 分享文件被点击 0303 看示例视频 0304 看PLC视频
    private String eventTypeCd;

    //触发类型名称
    // 0101 关注奖励 0102 签到奖励 0103 邀请关注 0104 公众号关键字命中
    // 0201 群签到 0202 群关键字命中 0203 拉新人入群 0204 创建新群
    // 0301 阅读价值文章 0302 分享文件被点击 0303 看示例视频 0304 看PLC视频
    private String eventTypeName;

    // 01 固定奖励PLC 02 随机奖励PLC 03 百分比下级收益 04 增加奖励次数
    private String bonusTypeCd;

    // 奖励数值
    // 固定奖励格式X
    // 随机奖励格式 X-Y
    // 百分比下级收益 X%
    // 奖励次数 X
    private String bonusNumber;

    //奖励次数
    private int bonusTimes;

    //奖励单位
    //01 次/人 02 次/人*天 03 次/人*群
    private String bonusUnitTypeCd;

    //奖励交互内容 01推送公众号消息 02群推送群消息 03 推送公众号消息
    private String successReplayContent;

    //奖励用尽交互内容 01推送公众号消息 02群推送群消息 03 推送公众号消息
    private String errorReplayContent;

    //未订阅公众号返回内容
    private String unsubscribeReplayContent;

    // 优先级
    private int pri;

    //上级收益配置
//    private String parentId;

    //下级收益配置
    private String parentId;

    //类型示例地址
    private String linkUrl;


    //统计计算的key
    @Transient
    private String totalKey;
    //唯一key
    @Transient
    private String uniqueKey;

    //根据规则计算奖励信息
    public BigDecimal getNumber() {
        BigDecimal result = BigDecimal.ZERO;
        switch (getBonusTypeCd()) {
            //固定奖励
            case BONUS_TYPE_FIXED:
                result = BigDecimal.valueOf(NumberUtils.toDouble(getBonusNumber()));
                break;
            //随机奖励
            case BONUS_TYPE_RANDOM:
                //随机范围
                String[] bonusNumberArray = StringUtils.split(getBonusNumber(), RANDOM_BONUS_SEPARATOR);
                //随机奖励
                result = BigDecimal.valueOf(RandomUtils.nextDouble(NumberUtils.toDouble(bonusNumberArray[0]), NumberUtils.toDouble(bonusNumberArray[1])));
                break;
            //百分比奖励
            case BONUS_TYPE_PERCENT:
                result = BigDecimal.valueOf(NumberUtils.toDouble(StringUtils.replace(getBonusNumber(), "%", StringUtils.EMPTY)));
                break;
            //次数奖励
            case BONUS_TYPE_ADD_TIMES:
                result = BigDecimal.valueOf(NumberUtils.toDouble(getBonusNumber()));
                break;
        }
        return result.setScale(2, RoundingMode.HALF_UP);
    }

    //根据规则计算奖励信息
    public BigDecimal getMaxNumber() {
        BigDecimal result = BigDecimal.ZERO;
        switch (getBonusTypeCd()) {
            //固定奖励
            case BONUS_TYPE_FIXED:
                result = BigDecimal.valueOf(NumberUtils.toDouble(getBonusNumber()));
                break;
            //随机奖励
            case BONUS_TYPE_RANDOM:
                //随机范围
                String[] bonusNumberArray = StringUtils.split(getBonusNumber(), RANDOM_BONUS_SEPARATOR);
                //随机最大奖励
                result = BigDecimal.valueOf(NumberUtils.toDouble(bonusNumberArray[1]));
                break;
            //百分比奖励
            case BONUS_TYPE_PERCENT:
                result = BigDecimal.valueOf(NumberUtils.toDouble(StringUtils.replace(getBonusNumber(), "%", StringUtils.EMPTY)));
                break;
            //次数奖励
            case BONUS_TYPE_ADD_TIMES:
                result = BigDecimal.valueOf(NumberUtils.toDouble(getBonusNumber()));
                break;
        }
        return result;
    }

}
